C++ inline 的函数 声明和实现能否分开? |
您所在的位置:网站首页 › c++ inline circle circle › C++ inline 的函数 声明和实现能否分开? |
可以这么声明,不会编译错误,但是在别的translation unit里就inline不了了。原因是一个函数要inline,编译器必须见过它的实现,否则编译器无米之炊无法inline。 具体点说就是这样,来举个天津栗子,在foo.h里你声明一个inline function: inline int foo();在foo.cpp里实现之, #include "foo.h" int foo() { return 233; }然后在另外一个TU,bar.cpp里去调用它, #include "foo.h" int bar() { return foo(); }然后问题来了,C/C++的编译器的工作方式是对每个c/cpp/cc……文件(也就是一个translation unit)分别预处理、编译,最后再链接到一起,于是你看到的是3个文件,编译器看到的是俩,而且看这俩文件的是两个分开的C++编译器进程: // 预处理过的foo.cpp inline int foo(); int foo() { return 233; }和 // 预处理过的bar.cpp inline int foo(); int bar() { return foo(); //编译器:inline? Show me the code! }很明显,在编译预处理过的bar.cpp的时候,编译器只见到了一个函数foo的声明,虽然脑袋上有个inline,但是并没有定义。于是尽管编译器可以选择是否真的inline,但在这里是无可选择的,没有代码,inline个啥。只能处理成调用,然后等着链接器去链啦。 当然,即使分开TU,想要inline也是可以做到的,方法是开启LTO(Link Time Optimization)然后祈祷编译器大神快快显灵。好在只要你没犯错,函数也确实适合inline,大神通常是会显灵的。 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |